关于mysql 联表使用count的一个问题

您所在的位置:网站首页 countif 数据不准 关于mysql 联表使用count的一个问题

关于mysql 联表使用count的一个问题

2023-07-18 13:48| 来源: 网络整理| 查看: 265

今天遇到了一个sql问题,及理解过程记录下

select a.id as id,

count(b.id)

from A a left join B b on a.id = b.aid

A表可以理解为班级表

B表为学生表,现在用以上语句试图求出每个班级下多少个学生

 

这个语句在oracle中,是有问题的,会直接报错,因为oracle要求非聚合函数的字段都必须进行分组

但是在mysql中不一样,所以以下分析是针对mysql的

这个语句执行出来貌似mysql自动完成了分组,其实是有细微差别的

当A表有数据时,则很正常

但是当A表为空数据时,执行以上语句,得到以下结果

null,0

从这个结果上看,和分组之后的结果就不一样了,增加分组

select a.id as id,

count(b.id)

from A a left join B b on a.id = b.aid

group by a.id

得到的结果是无记录

 

分析如下:

其实两个表的关联,可以理解为,两个表的所有列合并在一起,所有数据根据连接条件进行笛卡尔积之后得到的一个大的临时表,之后的所有过滤或其它函数之类的,就针对这个大的临时表进行操作

前者的写法,等同于

select a.id as id,

count(*)

from A a left join B b on a.id = b.aid

其联合后的临时表,其实是一个空表

那么使用count函数后,数据库会生成一个除了count(*)有值,其它字段都为null的结果集,以显示count(*) 的计算结果,所以前者就得到了null,0这样的结果集

而使用分组函数之后,分组函数的特点是,会忽略null值,从而得到正确结果

 

结论:

为了防止此问题的出现,在写sql时一定要规范,使用了聚合函数的查询,其它字段必须增加分组函数。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3